package main

import "fmt"

//https://blog.csdn.net/xia_xing/article/details/49423771
type Bag struct {
	Key string
}

type Bag2 struct {
	Key int
}

func main(){
	var b1 interface{}
	var b2 interface{}

	b1 = Bag{Key: "1"}
	b2 = Bag2{ Key: 0}
	
	//获取interface{}中存放的数据类型
	//方法1:断言：一般使用于已知interface中的对象的数据类型，
	//调用后自动将接口转换成相应的对象，
	//语法结构 接口对象(obj),存放的数据类型(string) ,
	//v,ok := obj.(string)，若是相应的对象ok则为真，v为相应对象及数据。
	{
		//判断是否是Bag类型  若不是则置为0
		b, ok := b1.(Bag)
		fmt.Println("Bag类型 ：",ok,"数据:",b)//Bag类型 ： true 数据: {1}
	}
	{   //判断是否是Bag2类型  若不是则置0
        b, ok := b2.(Bag2)
        fmt.Println("Bag2类型：", ok, "数据", b)
	}
	
    //方法二
	//switch type： 已知或者未知的对象数据类型均可，
	//b1.(type)必须配合switch来使用，不能单独执行此语句。
	//v表示b1 接口转换成Bag对象的值
    switch v := b1.(type){
	case Bag:
        fmt.Println("b1.(type):", "Bag", v)
    case Bag2:
        fmt.Println("b1.(type):", "Bag2", v)
    default:
        fmt.Println("b1.(type):", "other", v)
	}
}